perm filename GEN1[AI,JMC] blob
sn#005441 filedate 1971-08-13 generic text, type T, neo UTF8
;COMMON CHESS ROUTINES
TITLE GEN
;GENERATE MOVES
GENMOV: TRNN FL,TIMR
JRST NTMGM
AOS GMCTR
MOVEI I,0
CALLI I,31
CONI 730,SVTGM#
NTMGM: MOVE I,ULIM ;GET POINTER FOR STORING
MOVE MOVER,COLOR ;GET COLOR (FIRST PIECE THIS SIDE)
HRLI MOVER,-20 ;20 PIECES
GMV1: MOVE K,KIND(MOVER) ;FIND OUT WHAT KIND
JRST @GENTB(K) ;GENERATE CORRECT MOVES
GENTB: EXP GPN,GQRB,GKN,GQRB,GQRB,GKI
;MOVES FOR ROOKS, BISHOPS, QUEENS
GQRB: MOVE K,LM(MOVER) ;START OF MOVES
HLRE J,K ;NUMBER OF DIRECTIONS
JRST PLG4 ;MIDDLE OF LOOP (SEE PUTCH)
PLG2: ADDI K,10 ;NEXT DIRECTION
ANDI K,-10 ;START OF THOSE MOVES
PLG4: SKIPGE T1,JMOVE(K) ;MOVE THERE?
JRST PLG3 ;NO, GET NEXT DIR
PLG1: MOVE T2,T1 ;HOLD ON TO MOVE
ANDI T1,77 ;THE DESTINATION
SKIPGE T3,OCC(T1) ;ANYONE THERE?
JRST .+5 ;NO, NO WORRIES
XOR T3,MOVER ;SEE IF SAME COLOR
TRNN T3,20 ;OFF IF SAME
JRST PLG3-2 ;NOT GOOD TO CAPTURE OWN PIECE
TRO T2,CAPBT ;SET BIT FOR CAPTURE
DPB MOVER,[POINT 5,T2,29] ;PUT IN MOVER
MOVEM T2,(I) ;PUT THAT MOVE AWAY
SUBI I,1 ;DECREMENT POINTER
SKIPL T1,JMOVE+1(K) ;NEXT MOVE THERE?
AOJA K,PLG1 ;YES, GO LOOK AT IT
PLG3: AOJL J,PLG2 ;LOOK AT MORE DIRS. IF ANY
;COMMON RETURN POINT OF MOVE GENERATORS
COMRG: AOBJN MOVER,GMV1 ;LOOK AT MORE PIECES
PUSHJ P,KCAS ;NONE, CHECK TO SEE IF CASTLE
JRST DOCS1 ;NO, LOOK AT QUEEN SIDE
MOVEI T1,KSCBT ;THE BIT FOR THAT MOVE
MOVEM T1,(I) ;SET AS A MOVE
SUBI I,1
DOCS1: PUSHJ P,QCAS
JRST DOCS2 ;NOT HERE EITHER
MOVEI T1,QSCBT
MOVEM T1,(I)
SUBI I,1
DOCS2: MOVEM I,LLIM ;SAVE LOWER LIMIT
MOVEM I,LLIM2# ;SAVE HERE FOR EXTRA LOOK-AHEAD
TRNN FL,TIMR
POPJ P,
PUSH P,SVTGM
PUSHJ P,TIMIT
POP P,T1
ADDM T1,TMGM
POPJ P,
;MOVES FOR KNIGHTS
GKN: MOVE K,LM(MOVER) ;THE MOVE TABLE POINTER
HRLI K,-10 ;ALWAYS 10 POSSIBLE
GKN2: SKIPGE T1,JMOVE(K) ;A MOVE THERE?
JRST GKN1 ;NO, TRY NEXT
MOVE T2,T1 ;SAVE IT
ANDI T1,77 ;CHECK FOR SOMEONE THERE AS BEFORE
SKIPGE T3,OCC(T1)
JRST .+5
XOR T3,MOVER
TRNN T3,20
JRST GKN1
TRO T2,CAPBT
DPB MOVER,[POINT 5,T2,29]
MOVEM T2,(I)
SUBI I,1
GKN1: AOBJN K,GKN2 ;MOVES ARE FIRST 10
JRST COMRG ;NONE LEFT, RETURN TO COMMON PT.
;MOVES OF A KING. DO NOT WORRY ABOUT CHECK
GKI: MOVE K,LM(MOVER)
SKIPGE T1,JMOVE(K) ;LOOK FOR MOVES
JRST GMVK1 ;WILL CHECK NEXT DIRECTION
HRRZ T2,T1
ANDI T1,77 ;CHECK FOR PIECE AT DEST AND COLOR
SKIPGE T3,OCC(T1)
JRST .+5
XOR T3,MOVER
TRNN T3,20
JRST GMVK1
TRO T2,CAPBT
DPB MOVER,[POINT 5,T2,29]
MOVEM T2,(I)
SUBI I,1
GMVK1: ADDI K,7 ;ONLY FIRST MOVE IN EACH DIR TO CONSIDER
AOBJN K,GKI+1
JRST COMRG
;PAWNS ARE A REAL MESS. DO THEM HERE
GPN: HRRZ K,LM(MOVER) ;GET POINTER
SKIPGE T1,JMOVE(K) ;GET MOVE
JRST GMVP2 ;TRY SECOND POSSIBLE
HRRZ T2,T1 ;SAVE
ANDI T1,77 ;CHECK DEST
SKIPGE T3,OCC(T1) ;SOMEONE THERE (THIS MOVE A DIAG)
JRST GMVP1P ;NO, SO NOT GOOD UNLESS ENPAS
XOR T3,MOVER ;CHECK COLOR
TRNN T3,20
JRST GMVP2 ;WORNG (CAN'T BE ENPAS)
TRO T2,CAPBT
MOVE T3,RANK(T1) ;CAHCK FOR PROMOTION
CAIE T3,0 ;BLACK NEVER ON 10 WHITE NEVER ON 0
CAIN T3,7 ;SO DON'T WORRY ABOUT COLOR
PUSHJ P,PROMP ;YES GEN MOVES FOR ALL PPS PROMS
DPB MOVER,[POINT 5,T2,29]
MOVEM T2,(I) ;SAVE
SUBI I,1
JRST GMVP2 ;NOW FOR SECOND
GMVP1P: CAME T1,ENPSQ ;ONLY ON EP POSS AT A TIME, CHECK IT
JRST GMVP2 ;NO, TRY NEXT MOVE
MOVE T3,EPMOVER ;WHO IS HE
XOR T3,MOVER
TRNN T3,20
JRST GMVP2 ;DON'T CAPTURE OWN PIECE
TRO T2,CAPBT+EPCAP ;SET BITS
DPB MOVER,[POINT 5,T2,29]
MOVEM T2,(I) ;NO CHANCE OF PROMOTION
SUBI I,1
GMVP2: SKIPGE T1,JMOVE+1(K) ;SECOND MOVE
JRST GMVP3 ;NO,TRY THIRD
HRRZ T2,T1 ;SAVE
ANDI T1,77
SKIPGE T3,OCC(T1)
JRST GMVP2P
XOR T3,MOVER
TRNN T3,20
JRST GMVP3
TRO T2,CAPBT
MOVE T3,RANK(T1)
CAIE T3,0
CAIN T3,7
PUSHJ P,PROMP
DPB MOVER,[POINT 5,T2,29]
MOVEM T2,(I)
SUBI I,1
JRST GMVP3 ;NOW WASN'T THAT FUN
GMVP2P: CAME T1,ENPSQ ;THIS IS ALSO FAMILIAR
JRST GMVP3
MOVE T3,EPMOVER
XOR T3,MOVER
TRNN T3,20
JRST GMVP3
TRO T2,CAPBT+EPCAP
DPB MOVER,[POINT 5,T2,29]
MOVEM T2,(I)
SUBI I,1
GMVP3: SKIPGE T1,JMOVE+2(K) ;MOVE NO. 3
JRST COMRG ;IF NO #3 THE 4 IMPOSSIBLE TOO
TRZ T1,777700 ;REMOVE EXCESS BITS
HRRZ T2,T1 ;SAVE IT
TLNE T1,200000 ;WILL HAVE BIT IN LEFT ON IF ONLY PSEUDO
JRST COMRG ;COULDN'T BE A FOURTH MOVE
MOVE T3,RANK(T1) ;CHECK FOR PORMOTION
DPB MOVER,[POINT 5,T2,29] ;PUT IN MOVER BITS
CAIE T3,0
CAIN T3,7
PUSHJ P,PROMP
MOVEM T2,(I)
SUBI I,1
SKIPGE T1,JMOVE+3(K) ;NOW CHECK FOURTH
JRST COMRG ;NONE THERE
TRZ T1,777700 ;REMOVE BITS
HRRZ T2,T1 ;SAVE IT
TLNE T1,200000
JRST COMRG
TRO T2,EPSET ;SET BIT FOR ENPAS
MOVE T1,JMOVE+2(K) ;GET THE PLACE WHERE EP PSSS.
ANDI T1,77
LSH T1,13 ;MOVE TO CORRECT PLACE
IOR T2,T1 ;PUT IN THE MOVE WORD
DPB MOVER,[POINT 5,T2,29]
MOVEM T2,(I) ;AND PUT IT AWAY
SUBI I,1
JRST COMRG ;ALL DONE
;HERE IS WHERE WE GEN MOVES INVOLVING PROMOTIONS
PROMP: TRO T2,PROMBT ;TURN ON THE BIT
MOVEI T3,4 ;COULD PROMOTE TO Q-B-N-R (4-3-2-1)
PR1: DPB T3,[POINT 3,T2,22]
DPB MOVER,[POINT 5,T2,29] ;PUT IN MOVER
MOVEM T2,(I) ;PUT IT AWAY
SUBI I,1
CAIE T3,2 ;ONE MORE TO GO ITS SPEC
SOJA T3,PR1 ;NEXT POSSIBILITY
SUBI T3,1
DPB T3,[POINT 3,T2,22] ;PUT IT IN
POPJ P, ;WILL BE STORED AT RETURN PT
;HERE IS THE CHECKER TO SEE IF CASTELING IS POSS.
KCAS: MOVE T1,COLOR ;KING-SIDE GET COLOR
SKIPL LOC+7(T1) ;IS ROOK ON THE BOARD
TRNE FL,20(T1) ;20 IS WHITE OK 40 IS BLACK OK
POPJ P, ;NO RETURN
SKIPE T1 ;NOW FOR THE CORRECT SQUARES
MOVEI T1,70 ;FOR BLACK
SKIPGE OCC+5(T1) ;CHECK CQUARES FOR OCC
SKIPL OCC+6(T1)
POPJ P, ;CAN'T CASTLE IF OCC
IORI T1,4 ;CHECK FOR CHECK OR MOVE THRU CHECK
HRLI T1,-20 ;20 DIRECTIONS
KSCK1: SKIPGE T2,JBEAR(T1) ;A BEARING
JRST OKBK1 ;NO
TLNE T2,200000 ;MAYBE ONLY PSEUDO
JRST OKBK1
XOR T2,COLOR ;CHECK SAMENESS OF COLOR
TRNE T2,20
POPJ P, ;DIFFERENT, SO NO CASTLE
OKBK1: SKIPGE T2,JBEAR+1(T1) ;NOW FOR NEXT SQ
JRST OKBK2
TLNE T2,300000
JRST OKBK2
XOR T2,COLOR
TRNE T2,20
POPJ P,
OKBK2: SKIPGE T2,JBEAR+2(T1)
JRST OKBK3
TLNE T2,300000
JRST OKBK3
XOR T2,COLOR
TRNE T2,20
POPJ P,
OKBK3: ADDI T1,77 ;NEXT DIRECTION
AOBJN T1,KSCK1
AOS (P) ;CASTLE OK, RETURN .+1
POPJ P,
;HERE IS THE SAME THING FOR QUEEN SIDE
QCAS: MOVE T1,COLOR
SKIPL LOC(T1) ;IS ROOK THERE?
TLNE FL,20(T1) ;BUT FLAG BITS IN LEFT HALF
POPJ P,
SKIPE T1
MOVEI T1,70
SKIPGE OCC+1(T1) ;AND DIFFERENT SQUARES TO CHECK
SKIPL OCC+2(T1)
POPJ P,
SKIPL OCC+3(T1) ;AND ONE MORE TO CHECK
POPJ P,
IORI T1,1 ;AND DIFFERENT HERE TOO
HRLI T1,-20
QSCK1: SKIPGE T2,JBEAR+1(T1)
JRST OKBQ1
TLNE T2,300000
JRST OKBQ1
XOR T2,COLOR
TRNE T2,20
POPJ P,
OKBQ1: SKIPGE T2,JBEAR+2(T1)
JRST OKBQ2
TLNE T2,300000
JRST OKBQ2
XOR T2,COLOR
TRNE T2,20
POPJ P,
OKBQ2: SKIPGE T2,JBEAR+3(T1)
JRST OKBQ3
TLNE T2,200000
JRST OKBQ3
XOR T2,COLOR
TRNE T2,20
POPJ P,
OKBQ3: ADDI T1,77
AOBJN T1,KSCK1
AOS (P)
POPJ P,
;HERE IS THE ROUTINE TO MAKE A MOVE. THE MOVE IS IN MOVER AND
;HAS THE FOLLOWING FORM
;BITS 30-35 DESTINATION OF MOVING PIECE
;BITS 25-29 MOVING PIECE
;BIT 24 IS ON IF MOVE IS A CAPTURE
;BIT 23 IS ON IF MOVE IS AN ENPASSENT CAPTURE
;BIT 18 IS ON IF THIS MOVE GENERATES A POSSIBILITY FOR
; AN EP CAPTURE
; IF SO BITS 19-24 GIVE THE LOCATION TO WHICH A PAWN
; MUST MOVE TO MAKE TAHT CAPTURE
;BIT 19 IS ON TO INDICATE A PROMOTION TO BE MADE
; BITS 20-22 GIVE THE KIND TO PROMOTE TO
;BIT 21 IS ON FOR QUEEN SIDE CASTLE
;BIT 22 IS ON FOR KING SIDE CASTLE
;THIS ROUTINE IS CALLED WITH A JSR AND SAVES INFORMATION IN THE
;STACK
GOMOV: 0
PUSH P,FL ;SAVE FLAGS WITH IMPORTANT INFORMATION
TRZ FL,CAPHP+PROMDN ;ERASE FLAGS SO NO FOWL UP
MOVEM MOVER,SVMOV# ;SAVE THE MOVE
PUSH P,EPMOVER# ;THE PAWN WHICH MAY BE CAPTURED EP
PUSH P,ENPSQ# ;THE SQUARE ON WHICH IT'S GHOST LIES
TRNE MOVER,EPSET ;SHOULD WE SET EP INFO
JRST EPS
SETOM EPMOVER ;NO, SET EP NOT POSSIBLE
SETOM ENPSQ
TRNE MOVER,EPCAP ;IS IT AN EP CAPTURE
JRST CAPTEP
TRNE MOVER,PROMBT ;IS IT A PROMOTION
JRST NOCAST ;THE DO NOT LOOK FOR CASTLE BITS
TRNE MOVER,QSCBT ;QUEEN SIDE
JRST QSCS
TRNE MOVER,KSCBT
JRST KSCS
NOCAST: TRNN MOVER,CAPBT ;A CAPTURE?
JRST NOCAP
TRO FL,CAPHP ;LEAVE TRACKS SO IT CAN BE UNDONE
ANDI MOVER,77 ;WHERE ARE WE GOING?
PUSH P,MOVER ;MOVE SOMEONE OFF BOARD FROM HERE- SAVE
MOVE MOVER,OCC(MOVER) ;WHO GOES AWAY?
PUSH P,MOVER ;SO WE CAN GET HIM BACK
SCAP: MOVNI DEST,1 ;TO OFF BOARD
PUSHJ P,PUTCH
NOCAP: LDB MOVER,[POINT 5,SVMOV,29] ;GET THE MOVING PIECE
PUSH P,LOC(MOVER) ;SAVE THE SQUARE HE WAS ON
PUSH P,MOVER ;AND WHO HE WAS
LDB DEST,[POINT 6,SVMOV,35] ;WHERE IS HE GOING
PUSHJ P,PUTCH
MOVE MOVER,SVMOV ;NOW SEE IF HE GITS A PROMOTION
TRNE MOVER,PROMBT
JRST DPROM
PUSH P,FL ;SAVE THE NEW FLAGS WITH GOOD BITS
JRST @GOMOV ;AND RETURN
;NOW ALL THE SPECIAL PIECES OF CODE
;SET ENPAS
EPS: TRZ MOVER,PROMBT ;TO AVOID CONFUSION
LDB DEST,[POINT 6,SVMOV,24] ;THE SQUARE FOR GHOST
MOVEM MOVER,SVMOV ;PUT IT WHERE IT WILL BE SEEN
MOVEM DEST,ENPSQ
LDB MOVER,[POINT 5,SVMOV,29] ;AND WHO IT WAS
MOVEM MOVER,EPMOVER
JRST NOCAP+1 ;CAN NOT BE A CAPTURE
;EP CAPTURE
CAPTEP: MOVE MOVER,-1(P) ;THE OLD EPMOVER
PUSH P,LOC(MOVER) ;WHERE HE WAS
PUSH P,MOVER ;AND WHO HE WAS
TRO FL,CAPHP ;JUST PRETEND ITS ANY OTHER CAPTURE
JRST SCAP
;CASTELING
KSCS: MOVEI MOVER,4 ;KING MOVES
IOR MOVER,COLOR ;THIS ONE
PUSH P,LOC(MOVER) ;WILL SET UP TAKE BACK LIKE A CAPTURE
PUSH P,MOVER
MOVEI DEST,6 ;SET UP DEST
SKIPE COLOR
MOVEI DEST,76 ;FOR BLACK
PUSHJ P,PUTCH
MOVEI MOVER,7 ;SIMILAR FOR ROOK
IOR MOVER,COLOR
PUSH P,LOC(MOVER)
PUSH P,MOVER
MOVEI DEST,5
SKIPE COLOR
MOVEI DEST,75
COMCS: PUSHJ P,PUTCH
TRO FL,CAPHP ;PRETEND IT WAS JUST A CAPTURE
PUSH P,FL ;SAVE FLAGS
JRST @GOMOV ;AND RETURN
QSCS: MOVEI MOVER,4 ;QUEEN SIDE IS SIMILAR
IOR MOVER,COLOR
PUSH P,LOC(MOVER)
PUSH P,MOVER
MOVEI DEST,2
SKIPE COLOR
MOVEI DEST,72
PUSHJ P,PUTCH
MOVE MOVER,COLOR
PUSH P,LOC(MOVER)
PUSH P,MOVER
MOVEI DEST,3
SKIPE COLOR
MOVEI DEST,73
JRST COMCS ;THE COMMON PART
;PROMOTIONS ARE FUN BECAUSE OF THE TABLE TO BE ADJUSTED
DPROM: TRO FL,PROMDN ;LET THE TAKE BACK ROUTINE KNOW
LDB MOVER,[POINT 5,SVMOV,29] ;WHO IS IT?
PUSH P,LM(MOVER) ;ONE ENTRY WHICH GETS CHANGED
MOVE T2,PCTB(MOVER) ;THE DISPLAY NEED CHANGING
PUSH P,1(T2) ;SAVE THE OLD CHARACTER WORDS
PUSH P,2(T2)
MOVNI DEST,1 ;MOVE HIM OFF THE BACK ON
PUSH P,T2 ;SAVE THIS
PUSHJ P,PUTCH
POP P,T2 ;BUT ONLY FOR A LITTLE WHILE
LDB DEST,[POINT 3,SVMOV,22] ;WHAT KIND IS IT NOW
MOVEM DEST,KIND(MOVER) ;WAS PAWN NO NEED TO SAVE
IOR DEST,COLOR ;NEED DISPLAY CHARACTER
MOVE DEST,PCTB-1(DEST) ;GET IT HERE
MOVE T1,1(DEST)
MOVEM T1,1(T2) ;AND PUT IT DOWN
MOVE T1,2(DEST)
MOVEM T1,2(T2)
MOVE DEST,KIND(MOVER) ;WHAT WAS THAT AGAIN?
MOVNI T1,10
CAIN DEST,2 ;UNLESS KNIGHT PUT -10 IN LEFT OF LM
MOVEI T1,7 ;ELSE 7
HRLM T1,LM(MOVER)
LDB DEST,[POINT 6,SVMOV,35] ;WHERE HE WAS
PUSHJ P,PUTCH ;PUT BACK ON WITH RIGHT BEARINGS ETC
PUSH P,FL
JRST @GOMOV
;NOW TO RETRACT A MOVE
;ALSO CALLED WITH A JSR. GETS ALL INFO FROM STACK
UNMOV: 0
POP P,FL ;THESE FLAGS HAVE INFO ON KIND OF MOVE
TRZN FL,PROMDN ;WAS THERE A PROMOTION
JRST NOPROU ;NO
MOVE MOVER,-3(P) ;WHO WAS HE?
MOVE DEST,PCTB(MOVER) ;THE DISPLAY WORDS
POP P,2(DEST) ;RESTORE OLD ONES
POP P,1(DEST)
MOVNI DEST,1 ;NOW GET HIM OFF BOARD
PUSHJ P,PUTCH ;(ELSE BEARINGS GET CONFUSED
POP P,LM(MOVER) ;RESTORE THIS
SETZM KIND(MOVER) ;WAS A PAWN
NOPROU: POP P,MOVER ;GET WHO
POP P,DEST ;AND WHERE FROM
PUSHJ P,PUTCH ;PUT HIM BACK
TRZN FL,CAPHP ;CAPTURE
JRST NOCAPU ;NO, ALMOST DONE
POP P,MOVER ;PUT CAPTURED PIECE BACK
POP P,DEST
PUSHJ P,PUTCH
NOCAPU: POP P,ENPSQ ;RESTORE MISC. INFO
POP P,EPMOVER
POP P,FL ;THESE FLAGS ALSO HAVE CASTLEING BITS
JRST @UNMOV ;RETURN
;NO FOR A LITTLE PROGRAM TO DO ALPHA BETA
MKMOV: AOS LEVEL# ;LEVEL INCREASES BY ONE
MOVEI T3,0 ;ZERO THIS LEVEL OF PRINCIPAL VARIATION
IDPB T3,STWD
MOVE T3,STWD ;SET START OF PVAR POINTER
MOVEM T3,STWDP#
TRZ FL,INCKFF
HRLZI T1,500000
MOVEM T1,VALUE#
MOVE T1,ALPHA
TRNN FL,FGMF
JRST NF1
PUSHJ P,CKCK
JRST NF1A
MOVE T1,WCOUNT
SUB T1,BCOUNT
SKIPE COLOR
MOVNS T1
LSH T1,1
CAML T1,BETA
POPJ P,
CAMLE T1,ALPHA
MOVEM T1,ALPHA
SKIPA
NF1A: TROA FL,INCKFF
NF1: MOVEM T1,VALUE
PUSHJ P,GENMOV ;GENERATE POSSIBLE MOVES
PUSHJ P,ORDMV ;ORDER THEM BY PLAUSIBILITY
MOVE I,ULIM
TRNN FL,INCKFF
CAME I,LLIM2
JRST NOSTL
MOVEI T1,0
POPJ P,
NOSTL: TLNN FL,WP2M ;FULL WALLPAPER MODE?
JRST WP2A
TRO FL,PRWP
MOVE I,ULIM
CAMG I,LLIM
JRST EVPRT
WALPF1: CAMG I,LLIM
JRST WP2
MOVE MOVER,LEVEL
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
SOJG MOVER,.-2
MOVE T1,LEVEL
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
HLRE T1,(I)
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
HRRZ MOVER,(I)
PUSHJ P,PRNTMV
SOJA I,WALPF1
EVPRT: MOVEI T2,[ASCIZ /
EVALUATE
/]
PUSHJ P,TXTOU1
WP2: MOVE T1,ALPHA
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,BETA
PUSHJ P,NOUT
MOVEI T2,[ASCIZ /
/]
PUSHJ P,TXTOU1
WP2A: TRZ FL,PRWP
MOVE I,ULIM# ;GET SET TO EXAMINE
CAMG I,LLIM
JRST EVALIT ;EVALUATE IF NO MOVES FROM ORDERER
MOVE T3,LEVEL
CAML T3,MAXLV
JRST KISOFF
MOVE MOVER,(I) ;GET FIRST MOVE
DPB MOVER,STWD ;AND PUT IT IN THE PRINCIPLE VARIATION
LP: SKIPE QFLG ;SHOULD WE QUIT
POPJ P, ;YES
EXTERNAL QFLG,WCOUNT,BCOUNT
MOVE T3,LEVEL ;POSITION LEVEL POINTER
IDIVI T3,12
MOVE T3,SDBTBL(T3)
MOVEM T3,LVPLC
MOVE T4,SDBTB2(T4)
MOVEM T4,LVPLC2
CAMG I,LLIM# ;OUT OF MOVES YET?
JRST VALCK ;RETURN PRESENT VALUE IF NOT MINUS INFINITY
LOOKON: MOVE MOVER,(I) ;GET THE MOVE
TLNN FL,TRCMD ;IS THIS TRACE MODE?
JRST NOTRC1
MOVE T1,LEVEL
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
PUSHJ P,PRNTMV ;PRINT CURRENT MOVE
PUSHJ P,INWD ;GET SOME INPUT
CAIN T2,175 ;IS IT ALTMODE?
JRST NOTRC1 ;YES, CONTINUE
TLO FL,TRCPV ;NO, DO NOT TRACE LOWER
PUSH P,FL ;SAVE FLAGS
TLZA FL,TRCMD+TRCPV
NOTRC1: PUSH P,FL
SKIPE COLOR ;ONE EFFORT COUNT FOR BLACK AND ONE FOR WHITE
AOSA BEFFT#
AOS WEFFT#
PUSH P,I ;SAVE I
JSR GOMOV ;MAKE THE MOVE
;TIME OUT TO DEFINE A MACRO
DEFINE SAVE (A)
<IRP A <PUSH P,A>>
PUSH P,COLOR
MOVEI T1,20
XORM T1,COLOR
TRNN FL,INCKFF
TRNN FL,FGMF
JRST NONF
PUSHJ P,CKCK
JRST NONF
PUSHJ P,EVALIT ;GET VALUE
MOVE T2,WCOUNT ;COMPUT PIECE COUNT
SUB T2,BCOUNT
SKIPN COLOR
MOVNS T2
LSH T2,1
CAMG T2,ALPHA ;COMPARE WITH ALPHA
JRST NOGO ;DO NOT TAKE UNLESS BRINGS LEVEL ABOVE ALPHA
NONF: SAVE <ULIM,LLIM,LLIM2,LEVEL,ALPHA#,BETA#,CKLEV#,STWD,STWDP,VALUE>
MOVE T1,LLIM2 ;GET SET TO DO ANOTHER LEVEL
MOVEM T1,ULIM ;RESET MOVE GENERATING SPACE
MOVN T1,ALPHA ;INTERCHANGE AND INVERT ALPHA AND BETA
EXCH T1,BETA
MOVNM T1,ALPHA
TRNN FL,FGMF ;IS IT FORCED GAME?
JRST .+3 ;NO, FORGET IT
PUSHJ P,CKCK ;IN CHECK?
SOS CKLEV ;YES, DECREASE LEVEL
PUSHJ P,MKMOV ;NOW DO ANOTHER LEVEL
;ANOTHER MACRO
DEFINE UNSAVE (A)
<IRP A <POP P,A>>
UNSAVE <VALUE,STWDP,STWD,CKLEV,BETA,ALPHA,LEVEL,LLIM2,LLIM,ULIM,COLOR#>
NOGO1: JSR UNMOV ;RETRACT MOVE
POP P,I
POP P,FL ;RESTORE FLAGS AS SET BY TRACE
SKIPE QFLG
POPJ P,
MOVE T3,ALPHA ;DISPLAY ALPHA AND BETA
SKIPE COLOR
MOVNS T3 ;GET CORRECTED FOR WHO'S ON FIRST
MOVEI T4,ADP
SKIPE COLOR
MOVEI T4,BDP
PUSHJ P,DNUM ;DISPLAY
MOVE T3,BETA
SKIPE COLOR
MOVNS T3
MOVEI T4,BDP
SKIPE COLOR
MOVEI T4,ADP
PUSHJ P,DNUM
MOVNS T1 ;SINCE IT WAS EVALUATED FOR OTHER PLAYER, INVERT
TLZN FL,TRCPV ;SHOULD WE DO A PRINT
SKIPN T2,LEVEL
PUSHJ P,WALLP
TLNN FL,WP2M ;IF FULL WALLPAPER MODE
JRST WP2P
TRO FL,PRWP
PUSH P,T1
MOVE MOVER,LEVEL
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
SOJG MOVER,.-2
MOVE T1,LEVEL
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / A=/]
PUSHJ P,TXTOU1
MOVE T1,ALPHA
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / B=/]
PUSHJ P,TXTOU1
MOVE T1,BETA
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / V=/]
PUSHJ P,TXTOU1
MOVE T1,(P)
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
HRRZ MOVER,(I)
PUSHJ P,PRNTMV
POP P,T1
TRZ FL,PRWP
WP2P: CAML T1,BETA ;IS IT TOO GOOD?
JRST RTBTA ;YES, RETURN BETA
CAMLE T1,VALUE
MOVEM T1,VALUE
CAML T1,ALPHA
TRZ FL,INCKFF
CAMG T1,ALPHA ;TOO POOR?
JRST ADVSTW ;YES, IGNORE BUT ADVANCE STWD
MOVEM T1,VALUE
MOVEM T1,ALPHA ;YES IT IS GOOD
MOVE T2,(I) ;RETRIEVE MOVE
MOVE T3,STWDP
DPB T2,T3 ;MOVE UP THE PRINCIPLE VARIATION
SP1: ILDB T2,STWD
IDPB T2,T3
JUMPN T2,SP1
MOVEM T3,STWD
CAME T1,BETA ;IS BETA SAME AS ALPHA?
SOJA I,LP ;NO, GO LOOK AT MORE
POPJ P, ;YES, RETURN NOW WITH THAT VALUE
RTBTA: MOVE T2,(I)
MOVE T3,STWDP ;SAME AS ABOVE
DPB T2,T3
SP2: ILDB T2,STWD
IDPB T2,T3
JUMPN T2,SP2
MOVEM T3,STWD
POPJ P,
RTVAL: MOVE T1,VALUE ;RETURN A VALUE
POPJ P,
VALCK: CAMG I,LLIM2 ;ARE THERE ANY LEFT
JRST RTVAL ;NO, MUST GIVE VALUE
HLRE T1,(I) ;DOES IT GET INTO CHECK?
JUMPL T1,RTVAL ;YES, ALL GONE
MOVE T1,ALPHA ;CHECK CURRENT VALUE
CAME T1,[XWD 600000,0] ;IS IT MINUS INFINITY
JRST RTVAL ;NO, RETURN IT
JRST LOOKON ;YES, CONTINUE LOOKING
ADVSTW: MOVE T2,STWDP ;GET MAIN POSITION
MOVEM T2,STWD ;AND PUT HERE
ILDB T2,STWD ;LOOK FOR THE ZERO WORD
JUMPN T2,.-1
SOJA I,LP ;GO DO NEXT MOVE
NOGO: POP P,COLOR
MOVE T3,STWD
SETZM 1(T3)
JRST NOGO1
KISOFF: HRLZI T1,540000
POPJ P,
MAXLV: 100
INTERNAL MAXLV
;ROUTINE TO GET A CHARACTER FROM TTY
;CHARACTER IS RETURNED IN T2. CALLED BY PUSHJ.
GNCH: SOSG IBUF+2 ;CHECK FOR MORE
INPUT 2,0 ;TTY IS DEVICE 2
ILDB T2,IBUF+1 ;GET CHARACTER
JUMPE T2,GNCH ;IGNORE NULLS
POPJ P, ;RETURN
;THIS ROUTINE READS IN AN IDENTIFIER
;CALLED BY PUSHJ RETURN IDENT IN INBFH (ARRAY) ALSO FIRST
;WORD (ASCII) IN T1 AND TERMINATING CHAR IN T2. IF TERMINATOR
;IS FIRST THING SEEN RETURN IT IN T1 AND T2 AND INBFH.
INWD: SETZM INBFH
MOVE T1,[XWD INBFH,INBFH+1] ;CLEAR IT OUT
BLT T1,INBFH+22
MOVE T1,[POINT 7,INBFH]
PUSHJ P,GNCH
CAIG T2,40
JRST .-2 ;SKIP BLANKS TABS ETC
INWD1: CAIL T2,"0" ;A NUMBER?
CAILE T2,"9"
JRST SPCL1 ;NO CHECK FOR LETTER
INWD2: IDPB T2,T1 ;LETTER OR NUMBER
PUSHJ P,GNCH ;GET NEXT
JRST INWD1
SPCL1: CAIL T2,"A" ;A LETTER?
CAILE T2,"Z"
SKIPA ;NO, SPECIAL CHARACTER SO TERMINATE
JRST INWD2 ;YES, PACK IT
SKIPN INBFH ;ANY IDENTIFIER SEEN
IDPB T2,T1 ;NO, MAKE IT TERMINATOR
MOVE T1,INBFH ;RETURN FIRST 5 CHARS
POPJ P,
;GET A NUMBER (OCTAL) CALLED BY PUSHJ
;RETURNS NUMBER IN T1
NUMIN: MOVEI T1,0
SETZM NEGNUM#
PUSHJ P,GNCH ;GET A CHR
CAIG T2,40 ;IGNORE THESE RANDOM CHARACTERS
JRST .-2
CAIE T2,"-"
JRST NIN1
SETOM NEGNUM
PUSHJ P,GNCH
NIN1: CAIL T2,"0" ;NUMBER?
CAILE T2,"7"
JRST NIN2
LSH T1,3 ;PUT IT INTO NUMBER
IORI T1,-"0"(T2)
PUSHJ P,GNCH
JRST NIN1 ;CONTINUE
NIN2: SKIPE NEGNUM
MOVNS T1
POPJ P,
;ROUTINE TO PRINT NAME OF PIECE. CALLED BY PUSHJ WITH
;PIECE NUMBER IN T1
PCPRT: MOVEI T2,[ASCIZ /B/]
TRNN T1,20
MOVEI T2,[ASCIZ /W/] ;DECIEDE ON COLOR
TRNE FL,PRWP ;IF IN WALLP MODE
PUSHJ P,TXTOUT ;WRITE IT HERE
CALLI T2,3 ;USE DDT OUTPUT
MOVE T2,KIND(T1) ;GET KIND
MOVE T2,ASCP(T2) ;GET THE ASCII FOR THAT KIND
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
POPJ P,
;A MACRO TO MAKE PUTTING IN ASCII EASIER
DEFINE ASKR (A)
<IRP A <EXP [ASCII /A/]>>
ASCP: ASKR <P,R,N,B,Q,K>
;PRINT THE NAME OF A LOCATION
;CALLED BY PUSHJ WITH SQ NUMBER IN T1
LCPRT: MOVE T2,FILE(T1) ;PRINT NAME OF THAT FILE
MOVE T2,FLNM(T2)
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
MOVE T3,RANK(T1) ;NOW THE RANK
SKIPG COLOR ;LOOKING AT FORM WHICH SIDE?
JRST .+3
SUBI T3,7
MOVNS T3
ADDI T3,"1" ;MAKE IT ASCII
LSH T3,↑D29 ;LEFT JUSTIFIED
MOVEM T3,TMP#
MOVEI T2,TMP ;FOR DDT OUT
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
POPJ P,
FLNM: ASKR <QR,QN,QB,Q,K,KB,KN,KR>
;PRINT OUT A MOVE CALLED WITH MOVE IN MOVER
PRNTMV: PUSHJ P,PRNTM1
MOVEI T2,[ASCIZ /
/]
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
POPJ P,
PRNTM1: TRNN MOVER,EPSET ;IF SO NO CAST POSSIB
TRNE MOVER,PROMBT ;IF A PROMOTION DO NOT CHECK CASTELING
JRST NOCASP
TRNE MOVER,QSCBT ;CASTLEING IS SPECIAL
JRST QCSPT
TRNE MOVER,KSCBT
JRST KCSPT
NOCASP: LDB T1,[POINT 5,MOVER,29] ;GET MOVER
PUSHJ P,PCPRT ;PRINT IT
MOVEI T2,[ASCIZ ./.] ;AND A /
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
MOVE T1,LOC(T1) ;NOW WHERE IT IS
PUSHJ P,LCPRT
TRNE MOVER,EPSET ;NO CAPT IF EPSET
JRST NOCAPP
TRNE MOVER,CAPBT ;IS IT A CAPTURE
JRST CAPT
NOCAPP: MOVEI T2,[ASCIZ /-/]
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
DSTPT: LDB T1,[POINT 6,MOVER,35] ;PRINT DESTINATION
PUSHJ P,LCPRT
TRNN MOVER,EPSET ;NO PROMOTION IF EPSET
TRNN MOVER,PROMBT ;WORRY SOME MORE ABOUT PROMOTION
POPJ P, ;NONE HERE
MOVEI T2,[ASCIZ /=/]
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3 ;PRINT OUT THE PROMOTION
LDB T1,[POINT 3,MOVER,22] ;PROMOTE TO WHAT
MOVE T2,ASCP(T1) ;NAME OF THAT
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
POPJ P, ;ALL DONE
CAPT: MOVEI T2,[ASCIZ /*/] ;PRINT * FOR CAPTURE
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
TRNE MOVER,EPCAP ;ENPAS. IS EVEN WORSE
JRST ITSEP
LDB T1,[POINT 6,MOVER,35] ;WHO HE CAPTURE?
MOVE T1,OCC(T1)
PUSHJ P,PCPRT
MOVEI T2,[ASCIZ ./.] ;AND THAT LOCATION
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
JRST DSTPT
ITSEP: MOVE T1,EPMOVER ;THIS IS WHO HE CAPTURES
PUSHJ P,PCPRT
MOVEI T2,[ASCIZ ./.]
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
MOVE T1,LOC(T1) ;LOCATION OF THE SQUARE THAT PAWN IS ON
JRST LCPRT ;CAN NOT BE PROMOTION
QCSPT: MOVEI T2,[ASCIZ /O-O-O/]
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3 ;THESE ARE EASY
POPJ P,
KCSPT: MOVEI T2,[ASCIZ /O-O/]
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
POPJ P,
;NOW A ROUTINE TO PRINT THE BOARD AL A GREENBLATT
PTBD: MOVE DEST,[XWD -100,110] ;64 (DEC) SQRS
MOVEI T3,10 ;PUT ONLY 10 PER LINE
TLZ FL,BSQBT ;BIT FOR ON BLACK SQUARE
PTBD1: SKIPGE T1,OCC-20(DEST) ;ANYONE ON THIS SQUARE
JRST NOOC ;NO, PRINT -- OR **
PUSHJ P,PCPRT ;PRINT HIM
MOVEI T2,[ASCIZ / /]
CPTBD: TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
TLC FL,BSQBT ;ALTERNATE COLORS
SOJG T3,CPTBD2 ;OUT OF SQUARES ON THIS LINE?
MOVEI T2,[ASCIZ /
/] ;GO TO NEXT LINE
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
TLC FL,BSQBT ;NEED TO INVERT ANOTHER TIME
MOVEI T3,10 ;SET UP FOR 10 MORE
SUBI DEST,20
CPTBD2: AOBJN DEST,PTBD1 ;PRINT NEXT SQUARE
MOVEI T2,[ASCIZ /
/]
TRNE FL,PRWP
PUSHJ P,TXTOUT
CALLI T2,3
POPJ P,
NOOC: MOVEI T2,[ASCIZ /-- /] ;A WHITE SQUARE
TLNN FL,BSQBT ;OR IS IT BLACK?
MOVEI T2,[ASCIZ /** /] ;YES, IT IS
JRST CPTBD
;A ROUTINE TO SEE IF THE MOVER IS IN CHECK
CKCK: MOVE T1,COLOR
IORI T1,4 ;THE PROPER KING
MOVE T1,LOC(T1) ;WHERE IS HE?
HRLI T1,-20 ;20 DIRECTIONS TO CHECK
CKC2: SKIPGE T2,JBEAR(T1) ;A BEARING?
JRST CKC1 ;NO
TLNE T2,240000 ;IS IT ONLY A FAKE?
JRST CKC1 ;YES
XOR T2,COLOR ;IS IT OUR OWN PIECE
TRNE T2,20
POPJ P, ;NO, IN CHECK RETURN
CKC1: ADDI T1,77 ;NEXT DIRECTION
AOBJN T1,CKC2
AOS (P) ;NOT IN CHECK, RETURN .+1
POPJ P,
;HERE IS THE WALLPAPER MODE PRINTER
;FOR EACH MOVE AT THE TOP LEVEL THE MOVE IS PRINTED
;ALONG WITH THE PRINCIPLE VARIATION
;THE VALUE, PROPOSED VALUE, AND EFFORT (NUMBER OF
;POSITIONS EXAMINED) ARE ALSO PRINTED
WALLP: TLNN FL,WPMD ;IS THIS WALLPAPER MODE?
POPJ P, ;NO, RETURN
WALLP2: TRO FL,PRWP ;SO ALL THINKS ARE PRINTED ON CORRECT
;DEVICE
SAVE <T1,I,COLOR,STWD> ;SAVE THESE
SETZM SVT1# ;TO COUNT NUMBER OF MOVES TO RETRACT
MOVE MOVER,(I) ;GET THIS MOVE
PUSHJ P,PRNTMV
MOVEI T1,20
XORM T1,COLOR
AOS SVT1
JSR GOMOV
PRVT: ILDB MOVER,STWD ;GET A MOVE
JUMPE MOVER,EPV ;ZERO IS END OF PVAR
PUSHJ P,PRNTMV ;GO PRINT IT
AOS SVT1 ;COUNT IT
JSR GOMOV ;NOW MAKE IT SO CAN PRINT MORE
MOVEI T1,20 ;NEED TO CAHNGE COLOR
XORM T1,COLOR
JRST PRVT ;NEXT MOVE
EPV: JSR UNMOV
SOSE SVT1 ;RETRIEVE
JRST EPV
PEF: UNSAVE <STWD,COLOR,I> ;NOW ALMOST BACK TO WHERE WE WERE
MOVEI T2,[ASCIZ /V=/]
PUSHJ P,TXTOU1
MOVE T1,(P) ;VALUE OF THE MOVER
PUSHJ P,NOUT ;PRINT IT
MOVEI T2,[ASCIZ / PV=/]
PUSHJ P,TXTOU1
HLRZ T1,(I) ;THE PROPOSED VALUE OF THIS MOVE
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / MEF=/]
PUSHJ P,TXTOU1
SKIPE COLOR ;PRINT EFFORT FOR MOVER
SKIPA T1,BEFFT
MOVE T1,WEFFT
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / OPEF=/]
PUSHJ P,TXTOUT
JFCL
SKIPN COLOR ;NOW EFFOR FOR NON-MOVER
SKIPA T1,BEFFT
MOVE T1,WEFFT
PUSHJ P,NOUT
SETZM WEFFT
SETZM BEFFT ;ZERO IT FOR NEXT MOVE
MOVEI T2,[ASCIZ / RUNT=/]
PUSHJ P,TXTOU1
MOVEI T1,0
CALLI T1,27 ;GET RUNTIME
PUSH P,T1
SUB T1,SVRUNT
POP P,SVRUNT
PUSHJ P,NOUT
MOVEI T2,[ASCIZ /
/]
PUSHJ P,TXTOUT ;PRINT IT
JFCL ;SINCE IT RETURNS +1
TRNN FL,TIMR
JRST NOTMW
MOVEI T2,[ASCIZ /PUTCH /]
PUSHJ P,TXTOU1
MOVE T1,TMPUT
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,PTCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,TMPUT
IDIV T1,PTCTR
PUSHJ P,NOUT
SETZM TMPUT
MOVEI T2,[ASCIZ / GMOV /]
PUSHJ P,TXTOU1
SETZM PTCTR
MOVE T1,TMGM
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,GMCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,TMGM
IDIV T1,GMCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ /
MPRO /]
PUSHJ P,TXTOU1
SETZM TMGM
SETZM GMCTR
MOVE T1,TMMP
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,MPCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,TMMP
IDIV T1,MPCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / PUTM /]
PUSHJ P,TXTOU1
SETZM MPCTR
MOVE T1,TMPMP
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,MPPCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,TMPMP
IDIV T1,MPPCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,TMPMP
IMULI T1,↑D1000
IDIV T1,TMMP
PUSHJ P,NOUT
MOVEI T2,[ASCIZ /
FIL /]
PUSHJ P,TXTOU1
SETZM MPPCTR
SETZM TMPMP
MOVE T1,FTMR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,FTMR
IDIV T1,FCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,FTMR
IMULI T1,↑D1000
IDIV T1,TMMP
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / VUL /]
PUSHJ P,TXTOU1
MOVE T1,VTMR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,VTMR
IDIV T1,VCTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,VTMR
IMULI T1,↑D1000
IDIV T1,TMMP
PUSHJ P,NOUT
MOVEI T2,[ASCIZ /
VUL2 /]
PUSHJ P,TXTOU1
MOVE T1,V2TMR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,V2TMR
IDIV T1,V2CTR
PUSHJ P,NOUT
MOVEI T2,[ASCIZ / /]
PUSHJ P,TXTOU1
MOVE T1,V2TMR
IMULI T1,↑D1000
IDIV T1,TMMP
PUSHJ P,NOUT
MOVEI T2,[ASCIZ /
/]
PUSHJ P,TXTOU1
SETZM FTMR
SETZM V2CTR
SETZM TMMP
SETZM FCTR
SETZM VCTR
SETZM VTMR
SETZM V2TMR
SETZM VCTMR
NOTMW: TRZ FL,PRWP ;GO BACK TO TTY OUTPUT
OUTPUT 3,0 ;BUT MAKE SURE IT ALL GOT OUT
POP P,T1 ;RESTORE THE VALUE
POPJ P,
EXTERNAL GMCTR,MPCTR,MPPCTR,FTMR,VTMR,V2TMR,VCTMR,FCTR,VCTR,V2CTR,SVRUNT
;MISC. ROUTINES STARTING WITH A DECIMAL PRINT
NOUT: JUMPGE T1,NOUT1A
MOVEI T2,"-"
PUSHJ P,OCHR
MOVNS T1
NOUT1A: CAML T1,[XWD 200000,0]
JRST INFP ;SPECIAL INFINITY CHECK
NOUT1: IDIV T1,RADIX
ADDI T2,"0"
HRLM T2,(P)
SKIPE T1
PUSHJ P,NOUT1
HLRZ T2,(P)
JRST OCHR ;THIS IS SO FAMOUS IT NEEDS NO COMMENT
EXTERNAL RADIX
INTERNAL NOUT,TXTOU1
INFP: CAMG T1,[XWD 200000,0]
JRST INF1
MOVEI T2,[ASCIZ /2*/]
PUSHJ P,TXTOU1
INF1: MOVEI T2,[ASCIZ /INF/]
JRST TXTOU1
;NOW THE VARIOUS OUTPUT ROUTINES
OCHR: SOSG OBUF+2
OUTPUT 3,0
IDPB T2,OBUF+1
POPJ P,
TXTOUT: AOS(P)
TXTOU1: TLO T2,440700
MOVEM T2,SVT2#
TO1: ILDB T2,SVT2
JUMPE T2,RTXOUT ;ZERO IS END OF STRING USE ASCIZ
PUSHJ P,OCHR
JRST TO1
RTXOUT: POPJ P,
;HERE IS THE GLORIOUS MOVE INPUT ROUTINE
DEFINE SETOMR (A)
<IRP A <SETOM A>>
INMOV: SETOMR <FS1#,FS2#,FD1#,FD2#,RS#,RD#,K1#,K2#,PCI1#,PCI2#,PROKD#,SVN1#,SVN2#>
TRZ FL,CAPIN+PROIN ;TURN OFF FLAGS FOR PRO OR CAP INPUT
CAMN T1,[ASCIZ /O/]
JRST CSTLIN
HRLZI T3,-24 ;24 PIECE NAMES
CAMN T1,PCSYM(T3) ;IS IT THIS
JRST FPCSYM ;YES FOUND IT
AOBJN T3,.-2
POPJ P, ;NOT FOUND, ERROR RETURN
FPCSYM: MOVE T4,PCMN(T3) ;HAS LEFT KIND RIGHT PIECE OR -1
HLRZM T4,K1 ;SAVE KIND
HRREM T4,PCI1 ;AND PIECE NUMBER IF KNOWN
CAIN T2,"/" ;IS AN EXACT POSITION GIVEN?
JRST FPOS1 ;YES, GO GET IT
CPCK1: CAIE T2,"X" ;IS IT A CAPTURE
CAIN T2,"*"
JRST CAPTR ;YES
YL2: PUSHJ P,INWD ;GET THE DESTINATION
PUSH P,T2 ;WANT TO GET DIGIT OFF END IF THERE
SETZB T2,T3 ;T3 IS A COUNTER
LSH T1,-1 ;RIGHT JUSTIFY
MOVEM T1,SVT1
LSHC T1,-7 ;RIGHT ONE CHARACTER
SKIPN T2 ;THERE YET?
JRST .-3 ;NO, TRY AGAIN
ROT T2,7
CAIL T2,"1" ;IS IT A DIGIT
CAILE T2,"8" ;BUT ONLY 1-8
JRST NODIG
SUBI T2,"1"
MOVEM T2,SVN2
SUBI T2,7
SKIPE COLOR
MOVNM T2,SVN2
SKIPA
NODIG: MOVE T1,SVT1
POP P,T2 ;RESTORE THE BREAK CHR
HRLZI T3,-13 ;NOW LOOK FOR FILE INFORMATION
CAMN T1,LCSYM(T3)
JRST FLCSM2
AOBJN T3,.-2
POPJ P, ;ERROR, NOT THERE
FLCSM2: MOVE T4,LCMN(T3) ;THIS HAS THE TWO POSS. FILES
HRRZM T4,FD1
HLRZM T4,FD2
NL2: CAIE T2,"="
JRST COMPR ;NO PROMOTION INDICATED
TRO FL,PROIN ;SET PIT
PUSHJ P,INWD ;GET NEXT WORD
HRLZI T3,-4 ;CHECK THE KIND OF PIECE
HRRI T3,1 ;ONLY R,N,B, OR Q
CAMN T1,ASCP2(T3)
JRST FPRK
AOBJN T3,.-2
POPJ P,
FPRK: HRRZM T3,PROKD
COMPR: MOVEI I,MVTB+3777 ;SET UP TO GEN LEGAL MOVES
MOVEM I,LLIM
MOVEM I,ULIM
PUSHJ P,GENMOV
MOVE I,ULIM ;ARE THERE ANY
CAMN I,LLIM ;NO, MUST BE CHECKMATE
POPJ P, ;JUST AN ERROR IN THIS CASE
MOVE J,ULIM ;WHERE TO PUT GOOD ONES
ADDI J,1 ;FOR EASE IN MARKING
CLP: CAMN I,LLIM ;AT END YET?
JRST ENDINC ;YES, THANK GOD
MOVE MOVER,(I) ;GET THAT MOVE
TRNN FL,PROIN ;SHOULD BE PROMOTION?
JRST NOPRO ;NO
TRNN MOVER,EPSET ;NO PRO IF EPSET
TRNN MOVER,PROMBT ;IS IT?
JRST NTHS ;NO
LDB T1,[POINT 3,MOVER,22] ;CHECK WHAT PROMOTE TO
CAME T1,PROKD
JRST NTHS ;WRONG ONE
NOPRO: TRNN FL,CAPIN ;MAYBE A CAPTURE
JRST NOCAPI ;NOT THAT EITHER
TRNN MOVER,EPSET ;DON'T LOOK IN WRONG CASE
TRNN MOVER,CAPBT ;IS IT?
JRST NTHS ;NO,WRONG MOVE
TRNN MOVER,EPCAP ;IS IT EPCAP
JRST REGCAP ;NO, REGULAR
MOVE T1,EPMOVER ;WHO?
ANDI T1,17 ;IGNORE COLOR
SKIPGE PCI2 ;WAS PIECE SPECIFIED
JRST .+3
CAME T1,PCI2 ;IS IT SAME
JRST NTHS ;NO
MOVE T1,KIND(T1) ;WHAT KIND
CAME T1,K2 ;SAME
JRST NTHS
SKIPGE FD1 ;DESTINATION GIVEN?
JRST NODES
MOVE T1,EPMOVER ;GET SQUARE
MOVE T2,LOC(T1)
MOVE T2,FILE(T1)
CAME T2,FD1
CAMN T2,FD2 ;ONE OF THESE?
SKIPA ;YES
JRST NTHS ;NO
SKIPGE SVN2 ;WAS A DIGIT GIVEN?
JRST NODES ;NO
MOVE T2,RANK(T1) ;RANK OF THAT SQ
CAME T2,SVN2 ;SAME?
JRST NTHS ;NO
JRST NODES ;ON WITH SEARCH
REGCAP: LDB T1,[POINT 6,MOVER,35] ;WHERE ARE WE GOING
MOVE T1,OCC(T1) ;WHO IS THERE?
ANDI T1,17 ;IGNORE COLOR
SKIPGE PCI2 ;PIECE SPECIFIED
JRST .+3
CAME T1,PCI2
JRST NTHS
MOVE T1,KIND(T1)
CAME T1,K2 ;KIND CORRECT?
JRST NTHS
NOCAPI: SKIPGE FD1 ;WAS A DEST GIVEN?
JRST NODES
LDB T2,[POINT 6,MOVER,35] ;WHERE IS HE GOING
MOVE T1,FILE(T2) ;ITS FILE
CAME T1,FD1 ;SAME AS ONE OR THE OTHER
CAMN T1,FD2
SKIPA
JRST NTHS ;WRONG MOVE
SKIPGE SVN2 ;WAS RANK GIVEN
JRST NODES ;NO, GO ON
MOVE T1,RANK(T2)
CAME T1,SVN2 ;SAME?
JRST NTHS ;NO, ERROR
NODES: LDB T1,[POINT 4,MOVER,29] ;GET MOVING PIECE
SKIPGE PCI1 ;PIECE SPECIFIED
JRST .+3
CAME T1,PCI1 ;SAME?
JRST NTHS
MOVE T1,KIND(T1) ;CHECK KIND
CAME T1,K1 ;SAME?
JRST NTHS
SKIPGE FS1 ;SOURCE LOC. GIVEN?
JRST NOSRC
LDB T1,[POINT 5,MOVER,29] ;GET MOVER
MOVE T1,LOC(T1) ;AND LOC
MOVE T2,FILE(T1) ;OW FILE
CAME T2,FS1
CAMN T2,FS2 ;SAME AS EITHER?
SKIPA
JRST NTHS
SKIPGE T2,SVN1 ;RANK?
JRST NOSRC
CAME T2,RANK(T1)
JRST NTHS
NOSRC: SUBI J,1 ;SAVE IT AWAY
MOVEM MOVER,(J) ;THERE
NTHS: SOJA I,CLP ;END OF COMPARE, GO GET NEXT
FPOS1: PUSHJ P,INWD
PUSH P,T2 ;SAME AS AT YL2
MOVEI T2,0
LSH T1,-1
MOVEM T1,SVT1
LSHC T1,-7
SKIPN T2
JRST .-3
ROT T2,7
CAIL T2,"1"
CAILE T2,"8"
JRST NODIG2
SUBI T2,"1"
MOVEM T2,SVN1
SUBI T2,7
SKIPE COLOR
MOVNM T2,SVN1
SKIPA
NODIG2: MOVE T1,SVT1
POP P,T2
HRLZI T3,-13
CAMN T1,LCSYM(T3)
JRST FLCSYM
AOBJN T3,.-2
POPJ P, ;ERROR RETURN
FLCSYM: MOVE T4,LCMN(T3)
HRRZM T4,FS1
HLRZM T4,FS2
JRST CPCK1
CAPTR: PUSHJ P,INWD
TRO FL,CAPIN ;MARK AS CAPTURE
HRLZI T3,-24 ;GET PIECE
CAMN T1,PCSYM(T3)
JRST FPCSM2
AOBJN T3,.-2
POPJ P,
FPCSM2: MOVE T4,PCMN(T3)
HLRZM T4,K2
HRREM T4,PCI2
CAIE T2,"/" ;IS A LOC GIVEN
JRST NL2
JRST YL2
;HANDLE THE REMAINING MOVES
ENDINC: CAMLE J,ULIM ;WERE THERE ANY?
JRST IMPRT ;PRINT IMPOSSIBLE MESSAGE
CAME J,ULIM ;MAYBE JUST ONE?
JRST CKAMB ;NO SUCH LUCK, CHECK FURTHER
MOVE MOVER,@ULIM ;GET THE MOVE
AOS (P) ;SKIP RETURN
POPJ P,
;HERE CHECK TO SEE IF ALL BUT ONE OF THE MOVES IS CHECK
CKAMB: MOVEM J,LLIM ;SAVE THE NEW LOWER LIMIT
MOVE J,ULIM
MOVEM J,GER1# ;SAVE IT HERE
MOVEM J,PUTR1# ;AND HERE
AMBLP: CAMGE J,LLIM ;MORE TO GO?
JRST DNAM ;NO CHECK TO SEE IF ONLY ONE LEFT
MOVE MOVER,@GER1 ;GET A MOVE
JSR GOMOV ;MAKE IT
PUSHJ P,CKCK ;CHECK ON CHECK
JRST .+3 ;IN CHECK
MOVEM MOVER,@PUTR1 ;SAVE IT
SOS PUTR1 ;AND ADVANCE POINTER
JSR UNMOV ;RETRACT IT
SOS J,GER1 ;ADVANCE POINTER AND GET IT
JRST AMBLP
DNAM: AOS J,PUTR1 ;GET POINTER
CAME J,ULIM
JRST AMBPR ;STILL TOO MANY
MOVE MOVER,@ULIM ;GET MOE
AOS (P)
POPJ P,
AMBPR: MOVEI T1,[ASCIZ /AMBIG/]
CALLI T1,3 ;PRINT IT
POPJ P, ;ERROR RETURN
IMPRT: MOVEI T1,[ASCIZ /IMP/]
CALLI T1,3
POPJ P,
CSTLIN: CAIE T2,"-" ;DECIDE IF KING OR QUEEN SIDE
POPJ P,
PUSHJ P,INWD
CAME T1,[ASCIZ /O/]
POPJ P, ;MANY CHANCES FOR ERROR
CAIN T2,"-"
JRST QSD ;MUQT BE QUEEN SIDE
PUSHJ P,KCAS ;IS KING SIDE POSSIBLE
POPJ P, ;NO
MOVEI MOVER,KSCBT ;SET THE MOVE
CPOPJ1: AOS(P) ;OK RETURN
POPJ P,
QSD: PUSHJ P,INWD
CAME T1,[ASCIZ /O/]
POPJ P,
PUSHJ P,QCAS ;POSSIBLE?
POPJ P,
MOVEI MOVER,QSCBT
JRST CPOPJ1
;ROUTINE TO DISPLAY NUMBER NUMBER IN T3 POSIT IN T4
DNUM: MOVEI J,↑D12 ;12 DIGITS OF OCTAL
MOVEI T2,0
LSHC T2,3
HLLZ MOVER,NTB(T2)
IORI MOVER,202
MOVEM MOVER,(T4)
HRLZ MOVER,NTB(T2)
IORI MOVER,2
MOVEM MOVER,1(T4)
ADDI T4,2
SOJG J,DNUM+1
POPJ P,
;TABLE FOR INPUT ROUTINE
DEFINE ASKR2 (A)
<IRP A <ASCIZ /A/>>
PCSYM: ASKR2 <P,K,Q,R,N,B,KR,QR,KN,QN,KB,QB,KP,QP>
ASKR2 <KNP,QNP,KBP,QBP,KRP,QRP>
PCMN: BYTE (18) 0,-1,5,4,4,3,1,-1,2,-1,3,-1,1,7,1,0,2,6
BYTE (18) 2,1,3,5,3,2,0,14,0,13,0,16,0,11,0,15
BYTE (18) 0,12,0,17,0,10
DEFINE ASKR3 (A)
<IRP A <EXP "A">>
LCSYM: ASKR3 <R,N,B,K,Q,KR,QR,KN,QN,KB,QB>
LCMN: BYTE (18) 0,7,1,6,2,5,4,4,3,3,7,7,0,0,6,6,1,1,5,5,2,2
ASCP2: ASKR2 <P,R,N,B,Q>
;TABLES AND BUFFER FOR DISPLAY
DEFINE SDB (X,Y)
<XWD Y*400,X*400+210>
DEFINE DPY (X,Y)
<XWD Y*400,X*400+10>
DEFINE CHR (A,B)
<XWD A,202
XWD B,2>
DEFINE SC (X,A,B)
<IRP X <PC'X: SDB 300,0
CHR A,B>>
XLIST
NTB: XWD 405347,316501
XWD 775721,17777
XWD 65547,315471
XWD 565747,315511
XWD 637275,640557
XWD 541647,516506
XWD 415527,315517
XWD 770357,336574
SDBTBL: X=1000
REPEAT 12,<SDB X,200
X=X+20>
SDBTB2: X=1000
REPEAT 12,<SDB X,260
X=X+20>
PCTB: X=PC0
REPEAT 40,<EXP X
X=X+3>
0
POSTB: Y=36*4-3
REPEAT 10,<X=-4*36+7
REPEAT 10,<SDB X,Y
X=X+36>
Y=Y-36>
OFBTB: Y=36*4+200
REPEAT 2,<X=-4*36+7
REPEAT 10,<SDB X,Y
X=X+36>
Y=Y-36>
Y=-4*36-200
REPEAT 2,<X=-4*36+7
REPEAT 10,<SDB X,Y
X=X+36>
Y=Y+36>
LIST
;DISPLAY BUFFER
XLIST
DBUF: Y=36*4
REPEAT 10,<X=36*4
REPEAT 31,<DPY X,Y
X=X-12>
REPEAT 2,<Y=Y-12
X=36*4
REPEAT 11,<DPY X,Y
X=X-36>>
Y=Y-12>
X=36*4
REPEAT 31,< DPY X,Y
X=X-12>
XWD 2,204
PC0: SDB 300,0
CHR 360001,40074
PC1: SDB 300,0
CHR 714001,1
PC2: SDB 300,0
CHR 214021,243
PC3: SDB 300,0
CHR 700021,360
PC4: SDB 300,0
CHR 714001,163
PC5: SDB 300,0
CHR 214021,243
PC6: SDB 300,0
CHR 714001,1
PC7: SDB 300,0
CHR 360001,40074
SC (<10,11,12,13,14,15,16,17>,354021,273)
PC20: SDB 300,0
CHR 360007,640074
PC21: SDB 300,0
CHR 314525,117401
PC22: SDB 300,0
CHR 214727,707243
PC23: SDB 300,0
CHR 700327,603360
PC24: SDB 300,0
CHR 714305,403163
PC25: SDB 300,0
CHR 214727,707243
PC26: SDB 300,0
CHR 314525,117401
PC27: SDB 300,0
CHR 360007,640074
SC (<30,31,32,33,34,35,36,37>,354023,400273)
XWD 3,204
SDB 1000,0
ADP: REPEAT ↑D24,<0>
SDB 1000,100
BDP: REPEAT ↑D24,<0>
SDB 1000,230
CHR 405347,316501
CHR 775721,17777
CHR 65547,315471
CHR 565747,315511
CHR 637275,640557
CHR 541647,516506
CHR 415527,315517
CHR 770357,336574
CHR 445547,315511
CHR 745547,325541
LVPLC: SDB 1000,200
CHR 1,0
LVPLC2: SDB 1000,260
CHR 1,0
LIST
TBLG=.-DBUF
COM: IOWD TBLG,DBUF
0
TIMIT: CONI 730,T3
LDB T4,[POINT 6,T3,15]
SUBI T4,4
IMUL T4,[↑D1000000]
AND T3,[XWD 3,-1]
SUBI T3,136700
ADD T4,T3
EXCH T4,-1(P)
LDB T3,[POINT 6,T4,15]
SUBI T3,4
IMUL T3,[↑D1000000]
AND T4,[XWD 3,-1]
SUBI T4,136700
ADD T4,T3
MOVE T3,-1(P)
SUB T3,T4
SKIPGE T3
ADD T3,[↑D60000000]
MOVEM T3,-1(P)
POPJ P,
;AC DEFINITIONS
FL=0
P=17
MOVER=16
DEST=15 ;THESE MUST BE THE SAME AS IN PUTCH
T1=1
T2=2
T3=3
T4=4
K=6
I=7
J=10
;HERE ARE SOME OF THE FLAGS AND SPECIAL BITS USED
KSCBT==20000
QSCBT==40000
CAPBT==4000
EPCAP==10000
EPSET==400000
PROMBT==200000
CAPHP==1
PROMDN==2
PRWP==4
CAPIN==10
PROIN==100
FGMF==200
BSQBT==1
WPMD==2
WP2M==10
TRCMD==100
TRCPV==200
AFGM==2000
TIMR==4000
INCKFF==10000
INBFH: BLOCK 23 ;BUILD IDENTIFIERS
;AND NOW THE GLORIOUS EXTERNALS
EXTERNAL KIND,LM,JMOVE,OCC,RANK,LOC,JBEAR
EXTERNAL PUTCH,STWD,EVALIT,ORDMV,IBUF,FILE,INLP,OBUF,MVTB
EXTERNAL TMPUT,TMGM,TMMP,TMPMP,PTCTR
;AND INTERNALS
INTERNAL COM,INWD,INMOV,GOMOV,CKCK,UNMOV,COLOR,ALPHA,BETA,ENPSQ,EPMOVER
INTERNAL LEVEL,LLIM,MKMOV,NUMIN,PRNTM1,PRNTMV,ULIM,PTBD,BEFFT,WEFFT,OFBTB
INTERNAL CKLEV,PCTB,POSTB,WALLP2,STWDP,TIMIT,LLIM2
END